
// 输入两链表，请设计算法找出它们的第一个公共节点。

// 节点接口定义
interface ListNode {
    val: number;
    next: ListNode;
}
// 暴露接口
var getIntersectionNode: (headA: ListNode, headB: ListNode) => ListNode = function (headA, headB) {
    // 声明当前currA、currB
    let currA: ListNode = headA;
    let currB: ListNode = headB;
    // 交替双指针循环
    while (currA !== currB) {
        currA = currA == null ? headB : currA.next;
        currB = currB == null ? headA : currB.next;
    }
    return currA;
};

    // 我们使用两个指针 currA，currB 分别指向两个链表 headA，headB 的头结点，
    // 然后同时分别逐结点遍历，当 currA 到达链表 headA 的末尾时，
    // 重新定位到链表 headB 的头结点；
    // 当 currB 到达链表 headB 的末尾时，
    // 重新定位到链表 headA 的头结点。
    // 这样，当它们相遇时，所指向的结点就是第一个公共结点。
    // 这种交替走的双指针最妙的地方在于最后null值的判断，
    // 大家可以理解为两条链表最后都会指向了同一个 null 节点，代替了不相交的特殊情况。